// #include<pthread.h>
// #include<iostream>
// #include<unistd.h>
// #include"Mutex.hpp"

#include <pthread.h>
#include <iostream>
#include <unistd.h>
#include <string>
#include "Mutex.hpp"

class Date {
public:
    Date(std::string name, Mutex& mu)  // 使用引用传递Mutex
        : _name(name), _td(&mu)  // 存储Mutex的地址
    {
    }

    std::string _name;
    Mutex* _td;   // 使用指针来共享同一个Mutex
};

int sum=1000;
void * routine(void *arg)
{
Date * td=(Date*)arg;
while(1)
{
    //加锁
    //td->Lock();
    td->_td->Lock();
    if(sum>0)
    {
        printf("%s sells ticket:%d\n",td->_name.c_str() ,sum);
        sum--;
        //解锁
       td->_td->UnLock();
    }
    else 
    {
        //解锁
        td->_td->UnLock();
        break;
    }
}
return nullptr;  
}
 int main()
 {

        pthread_t t1=0;
      pthread_t t2=0;
            pthread_t t3=0;
     pthread_t t4=0;
       // pthread_t t1=0;
// //      // pthread_mutex_t m
      Mutex mutex;
       Date d1("thread-1",mutex);
       Date d2("thread-2",mutex);
       Date d3("thread-3",mutex);
       Date d4("thread-4",mutex);
// //       //封装的是局部的，我需要把锁给传进去才能使用使用，那我要是也想知道名字呢？传类
     pthread_create(&t1,nullptr,routine,(void*)&d1);
       pthread_create(&t2,nullptr,routine,(void*)&d2);
       pthread_create(&t3,nullptr,routine,(void*)&d3);
       pthread_create(&t4,nullptr,routine,(void*)&d4);
// //       //pthread_create(&t,nullptr,routine,"thread-");
//       int *a=nullptr;
       pthread_join(t1, nullptr);
   pthread_join(t2, nullptr);
    pthread_join(t3, nullptr);
   pthread_join(t4, nullptr);
       return 0;
 }



// int sum = 1000;
// void* routine(void* arg) {
//     Date* td = (Date*)arg;
//     while (1) {
//         td->_td->Lock();
//         if (sum > 0) {
//             printf("%s sells ticket:%d\n", td->_name.c_str(), sum);
//             sum--;
//             td->_td->UnLock();
//         } else {
//             td->_td->UnLock();
//             break;
//         }
//     }
//     return nullptr;
// }




// }
// int main() {
//     pthread_t t1, t2, t3, t4;
//     Mutex mutex;  // 创建一个Mutex对象，会被多个线程共享

//     Date d1("thread-1", mutex);
//     Date d2("thread-2", mutex);
//     Date d3("thread-3", mutex);
//     Date d4("thread-4", mutex);

//     pthread_create(&t1, nullptr, routine, (void*)&d1);
//     pthread_create(&t2, nullptr, routine, (void*)&d2);
//     pthread_create(&t3, nullptr, routine, (void*)&d3);
//     pthread_create(&t4, nullptr, routine, (void*)&d4);

//     pthread_join(t1, nullptr);
//     pthread_join(t2, nullptr);
//     pthread_join(t3, nullptr);
//     pthread_join(t4, nullptr);

//     return 0;
// }



























// int ticket=1000;
// pthread_mutex_t mutex;
// void*routine(void *arg)
// {
//     char *id = (char*)arg;
//      while ( 1 ) 
//     {
//         //加所
//         pthread_mutex_lock(&mutex);
//         if ( ticket > 0 ) 
//         {
//             //usleep(1000);
//             // printf("%s sells ticket:%d\n", id, ticket);
//             printf("%s sells tick:%d\n",id,ticket);
//             ticket--;
//             //解锁
//             pthread_mutex_unlock(&mutex);
            
//         }
//         else{
//              pthread_mutex_unlock(&mutex);
            
//             break;
//         }
//     }
// return nullptr;
// }


// // void *routine(void *arg)
// // {
// //  char *id = (char*)arg;
// //  while ( 1 ) {
// //  if ( ticket > 0 ) {
// //  usleep(1000);
// //  printf("%s sells ticket:%d\n", id, ticket);
// //  ticket--;
// //  } else {
// //  break;
// //  }
// //  }
// //  return nullptr;
// // }
// int main()
// {
//     pthread_t t1=0;
//      pthread_t t2=0;
//       pthread_t t3=0;
//        pthread_t t4=0;
//        // pthread_t t1=0;
      

//        pthread_mutex_init(&mutex,nullptr);
//     pthread_create(&t1,nullptr,routine,(void*)"thread-1");
//       pthread_create(&t2,nullptr,routine,(void*)"thread-2");
//       pthread_create(&t3,nullptr,routine,(void*)"thread-3");
//       pthread_create(&t4,nullptr,routine,(void*)"thread-4");
//       //pthread_create(&t,nullptr,routine,"thread-");
//       int *a=nullptr;
//       pthread_join(t1,(void**)&a);
//        int *b=nullptr;
//       pthread_join(t2,(void**)&b);
//        int *c=nullptr;
//       pthread_join(t1,(void**)&c);
//        int *d=nullptr;
//       pthread_join(t1,(void**)&d);
//       return 0;
    
// }